/**
 * 起点在原点，给定终点
 * 再给定走步的序列。问：
 * 是否有可能通过删除若干步，使得可以走到终点
 * 如果可以，输出任意一个可行操作
 * 并且输出有多少种删除方案可以使得走到终点。
 * 
 * 行列可以分别计算。以行为例，以Row为正为例
 * 假设一共有z个U操作，f个D操作
 * U操作需要比D操作多Row个，方案总数为：
 * C(z, Row+0) * C(f, 0) + C(z, Row + 1) * C(f, 1) + ...
 * 该数量记作rowAns
 * 同理可求colAns
 * 二者相乘即方案总数。
 * 
 * 可行操作更加简单，以Col也为正为例，遍历原有序列，
 * 留下前Row个U和前Col个R即可。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using vi = vector<int>;
using llt = long long;

llt const MOD = 1E9 + 7;

llt qpow(llt a, llt n){
    a %= MOD;
    llt ans = 1;
    while(n){
        if(n & 1) ans = ans * a % MOD;
        a = a * a % MOD;
        n >>= 1;
    }
    return ans;
}

llt inv(llt a){return qpow(a, MOD - 2LL);}

vector<llt> Fac, IFac;

llt Cmod(llt n, llt m){
    if(m < 0 or m > n) return 0;
    return Fac[n] * IFac[m] % MOD * IFac[n - m] % MOD;
}

pair<int, int> DD[256];

int N;
string S;
int Row, Col;
string Ans;

llt proc(llt target, llt z, llt f){
    if(target == 0){
        llt ans = 0;
        for(int i=0,n=max(z, f);i<=n;++i){
            ans = (ans + Cmod(z, i) * Cmod(f, i) % MOD) % MOD;
        }
        return ans;        
    }

    if(target > 0){
        llt ans = 0;
        for(int i=0,n=max(z, f);i<=n;++i){
            ans = (ans + Cmod(z, i + target) * Cmod(f, i) % MOD) % MOD;
        }
        return ans;
    }

    llt ans = 0;
    for(int i=0,n=max(z, f);i<=n;++i){
        ans = (ans + Cmod(z, i) * Cmod(f, i - target) % MOD) % MOD;
    }
    return ans;
}

void work(){
    cin >> N >> Row >> Col >> S;
    int x = 0, y = 0;
    int cnt[256] = {0};
    for(auto c : S){
        x += DD[c].first;
        y += DD[c].second;
        cnt[c] += 1;
    }

    llt dx = x - Row;
    llt dy = y - Col;
    
    Ans.clear();
    char cx = 'U';
    if(Row < 0) cx = 'D', Row = -Row;
    char cy = 'R';
    if(Col < 0) cy = 'L', Col = -Col;

    if(Row > cnt[cx] or Col > cnt[cy]){
        return (void)(cout << "NO" << endl);
    }
    
    for(auto c : S){
        if(c == cx){
            if(Row != 0){
                Row -= 1;
                Ans += c;
            }
        }else if(c == cy){
            if(Col != 0){
                Col -= 1;
                Ans += c;
            }
        }
    }     


    llt ans = proc(dx, cnt['U'], cnt['D']);
    llt tmp = proc(dy, cnt['R'], cnt['L']);
    ans = ans * tmp % MOD;
    assert(ans); 
    cout << "YES " << Ans << " " << ans << endl;
    return;
}

void init(int n){
    Fac.assign(n, 0);
    IFac.assign(n, 0);
    Fac[0] = 1;
    for(int i=1;i<n;++i) Fac[i] = Fac[i - 1] * i % MOD;
    IFac[n - 1] = inv(Fac[n - 1]);
    for(int i=n-2;i>=0;--i) IFac[i] = IFac[i + 1] * (i + 1) % MOD;
    assert(1 == IFac[1] and 1 == IFac[0]);
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    DD['U'] = {1, 0};
    DD['D'] = {-1, 0};
    DD['L'] = {0, -1};
    DD['R'] = {0, 1};

    init(1E5+100);

    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--) work();
    return 0;
}